We often inherit existing Django projects at Lincoln Loop either to provide ongoing maintenance or build new features (or both). Usually these projects are in some state of neglect and disrepair when they come to us. If they were a …
As your organization looks to resolve nagging problems with its website, app, or other tool, engaging with outside developers can feel daunting. Maybe your last agency collaboration didn’t yield the right results, or you’re worried about operating within a tight …
When you’re responsible for your organization’s website, you live in a state of constant worry about its stability. After all, your site is the most prominent touchpoint between the audience you need and the message you have to deliver. If …
When your organization is planning a digital transformation, your website is the headlining act. Rethinking the technology and strategies that best support your message going forward requires time, effort, and a significant investment. If you don’t manage the effort to …
I don’t like Django’s manage.py. My gripes against it are:
The plethora of files that clutter the root directory of our repos annoys me. manage.py is just one more in a long line of those.
In my opinion, there are …
When our agency began in 2007, using Python on the web was still a rarity, but some new projects in the space were starting to pop up. TurboGears had gained popularity with its MVC approach, but it was another Python …
It’s every publisher’s dream to “go viral” and reach thousands, if not millions, of new people. Many videos, tweets, images, articles, and infographics are created with exactly this goal in mind. But far too often, less thought goes into ensuring …
Back in 2018, I wrote about using setup.py in your Django/Python project. Five years later, setup.py is being phased out in favor of pyproject.toml. I’m a big fan of this change. With setup.py you could really go off the rails …
Your website is the hub of your business. It holds the promise of competitive advantage and the responsibility of delivering excellent customer service.
Designing and building any new web application or restructuring your web development operations is a substantial undertaking, …
tl;dr I built a benchmark for Python Package managers, you can view it at https://lincolnloop.github.io/python-package-manager-shootout/
When starting a new Python project, you have a few different options for how you want to manage your dependencies. Like Node.js has npm, yarn, …
One of the first things you need to do when starting a new Django project is to choose which version of Django you are going to use. At any given time, there could be as many as three supported Django …
In 2014 Yann Malet and I (with the help of the rest of the team here) wrote a book about building and scaling Django websites. It was the culmination of things we’d learned from, at the time, close to a …
As you start scaling an application out horizontally (adding more servers/instances), you may run into a problem that requires distributed locking. That’s a fancy term, but the concept is simple. Sometimes you have to be sure that when a block …
I’ve been working quite a bit lately on streamlining Lincoln Loop’s standard deployment systems. One thorn we’ve always had is how to handle application configuration.
In the past, we would have our configuration management system write the configuration out to …
Two of the biggest benefits pipenv and poetry are dependency locking and hash checking. Dependency locking means you can specify the direct dependencies your code requires, for example, celery==4.4.* and the tooling will lock, not only celery to a specific …
In a previous post, we showed how to use shiv to bundle a Django project into a single file for distribution and deployment. Running a large Python project as a single file feels like magic – which is great until …
This post covers portions of my talk, Containerless Django, from DjangoCon US 2018.
Deploying Python has improved significantly since I started working with it over a decade ago. We have virtualenv, pip, wheels, package hash verification, and lock files. Despite …
Our venerable IRC logger, BotBot.me logged its first lines in the summer of 2012 . Since then, it has logged over 100 million lines for more than 400 IRC channels, primarily on the Freenode and Mozilla networks. Despite the rise …
With Ubuntu 14.04 (Trusty) now a year away from end-of-life, we’ve been planning and performing upgrades for the soon-to-be legacy OS. The biggest change is the move from Upstart to Systemd for managing services. It’s trivial to convert a service …
I’ll be the first to admit that I was skeptical about Systemd and its companion log aggregator Journald, but after working with if for a few months, I’ve seen the light (or drunk the Kool Aid… not sure).
Typically I …
Every Django project starts with a manage.py file in its root. It’s a convenience script that allows you to run administrative tasks like Django’s included django-admin.
In our last post, we discussed the merits of including a setup.py file in …
A client recently asked me why all the Django projects we create have a setup.py in the root of the project. Lots of projects get by just fine without one, so why do I use it? The explanation turned out …
Good logging is critical to debugging and troubleshooting problems. Not only is it helpful in local development, but in production it’s indispensable. When reviewing logs for an issue, it’s rare to hear somebody say, “We have too much logging in …
One of Django’s nice “batteries included” features is the ability to send emails when an error is encountered. This is a great feature for small sites where minor problems would otherwise go unnoticed.
Once your site start getting lots of …
One of the things I love about the DevOps movement is how (when done right) it empowers developers to work with infrastructure in a safe and controlled manner. Once you’ve nailed down deployments to a static set of servers (production, …
In this long overdue follow-up to Part 1, I’ll be discussing the infrastructure issues associated with creating and serving image thumbnails at scale. The naive solution to generating thumbnails is to declare the image sizes you want in your templates …
One of my favorite patterns in Django is the combination of “fat” models and cached_property from django.utils.functional.
Fat models are a general MVC concept which encourages pushing logic into methods on your Model layer rather than the Controller (“view” in …
Django’s Signal Dispatcher is a really powerful feature that you should never use. Ok, it has valid use cases, but they may be rarer than you think.
First, to dispel a misconception about signals, they are not executed asynchronously. There …
In another of our “you can do that?!?” with uWSGI posts, today I’ll show you how to use uWSGI to host multiple sites and properly route traffic based on the hostname to those sites.
Multiple Sites (aka Emperor Mode)
uWSGI …
April marked Lincoln Loop’s 10th anniversary in business. As I reflect on that, I find myself going through all the typical platitudes: it’s been a roller-coaster ride, how proud I am of the team, looking forward to another 10 years, …
Serving Static Files with uWSGI
As noted in a previous post, uWSGI is a Swiss Army knife of functionality. One of its features is a built-in static file server.
When to Use uWSGI for Serving Static Files
While it may …
Images are everywhere on the web. Whether you’re building a simple blog, a CMS, or a true web application, chances are good that you’ll need to deal with images. Editors, authors, users, etc. expect to be able to upload images …
Our Kickstarter campaign for a companion video series to our book High Performance Django ended today just shy of its target. We consider it a great success!
That’s right… a success. When we started the campaign, our internal goal was …
uWSGI is one of those interesting projects that keeps adding features with every new release without becoming totally bloated, slow, and/or unstable. In this post, we’ll look at some of its lesser used features and how you might use them …
I’ve been working on improving our deployment processes as part of the High Performance Django Infrastructure project we’re building out. One consistent pain point is our front-end build system, and particularly, npm installs. For a number of reasons, instead of …
Alternate title: Pip 7 is Awesome, Here’s Why
A typical Python deployment looks like this:
Pave the server, setting up a virtualenv and installing any pre-requisites necessary to build/install the Python requirements (compiler, development headers, etc.).
To update to a …
Part of my job at Lincoln Loop is to explore new technologies and make sure that, as a company, we stay current. I’ve been playing around with Docker for a while, but recently decided to redeploy some of our production …
One of the most common requests we’ve heard since releasing our book, High Performance Django is: “Do you have more code/configuration examples?” It’s a pretty loaded question because the book covers everything from Python code to deploying and configuring servers. …
With the launch of our book, High Performance Django, we’ve received a number of inquiries from people asking for advice, for which the answers are too specific to their application to give good general advice, and too short to sign …
Do you manage a website? Does it have a login form? Can somebody brute force attack it with every common username/password combination until they find one that works?
For many small web applications, the answer to all of the above …
Last month, I presented High Performance Django: From Runserver to Reddit Hugs at DjangoCon US in Portland. My assertion was that Django, left to its own devices, does not scale. With the right supporting servers, however, it can scale fantastically. …
I’m excited to announce that our book, High Performance Django is officially complete. You can buy a copy at highperformancedjango.com now.
Thank You
Writing the book was hard work and there were definitely times where the challenge felt insurmountable. I …
I'm really excited to (finally) announce that we are writing a book! We've been working with Django professionally for a long time (over 7 years now). During that time, we've learned a lot about how to use the framework to …
Building realtime applications is a big change from how we’ve built websites in the past. Typically, realtime websites require each client holding open a long-running connection to the server so updates can be pushed down to the client immediately. This …
2013 was an amazing roller coaster year at Lincoln Loop. This is a long post, so I’ll skip the intro and dive right in.
Company Accomplishments
Of all the things we did and built, I’m most proud of what we …
Over the years, I’ve used a lot of server monitoring systems. Big enterprisey ones like Zabbix, Zenoss, and Hyperic, smaller ones like munin and monit, stuff in the middle like Graphite, and hosted solutions like New Relic. Throughout the search, …
Trailmapping.com was a fun experiment with rapid development in Django I released almost 5 years ago now(!). I spoke about it at the first DjangoCon (also my first “real” talk in front of an audience). I didn’t give it much …
Over the last couple months we’ve been busy tying up loose ends and preparing for our first “official” company-wide retreat. Even though we’re a fully distributed team, we’re big believers in the power of meet-ups and face-time. They form bonds, …
A common paradigm in Django is to create different settings files for different environments (local, production, staging, etc.). Everyone has their own opinion on how to set these up (see ours here), that’s not what this post is about. Instead, …
2012 was another amazing year at Lincoln Loop. I’m incredibly proud of the work we accomplished and the growth and development we’ve made as a company. A few of the highlights:
We launched our first product, Ginger. It is critical …
In our last installment, I introduced our distributed workplace and why we prefer it over a traditional office. Over the years, we’ve learned a lot about how to make a distributed workplace, well… work.
The single most important we learned …
Today we’re introducing a new member of the Lincoln Loop family, BotBot.me. At the moment, BotBot is beautiful hosted IRC logs (try #django or #go-nuts). We built it for people who love IRC and we want your advice to improve …
First off, realtime websites are hard. The current toolset is rudimentary. When I first started building Ginger, I thought I must be doing it wrong because of all the trial-and-error and pieces I was building from scratch. After watching Geoff …
Here’s a map of our current offices at Lincoln Loop:
That’s 10 people, 5 timezones, and 3 continents for those of you counting at home. I use the term “office” loosely because we don’t have a central office in the …
One of my recent tasks in Ginger was to ensure that we weren’t leaking referrer URLs when you click on an external link in Ginger. It seemed like an easy task and one that’s probably been solved before. What I …
Our new product Ginger relies heavily on Backbone.js for most of the client-side functionality (you can read about our full web-stack here). Our JavaScript guru Marco built the initial prototype and then was pulled away by client work. I reluctantly …
As mentioned in my previous post, everyone at Lincoln Loop sets their own salary. It’s another radical divergance from the business norm that we borrowed from the book of Ricardo Semler.
Every six months, I meet with each of our …
Maverick by Ricardo Semler was an eye-opening read for me a while back. It is a detailed account of his (highly profitable) company which is a radical departure from the traditional workplace. Rework (published over 20 years later) reads like …
For our latest product, Ginger, we wanted to marry the real-time functionality we needed with the traditional Django stack we know and love. After some false starts and falling on our faces in the beginning, we ended with a stack …
Development is a creative endeavor. Often developers are creating something where there was once nothing. For most us, the thought of being productive for 8 consecutive hours 5 days a week is laughable. 2-3 hours on a single problem is …
Our team of 10 is distributed across 8 countries and 3 continents. We have no central office. When we first started, a couple years might go by without ever meeting in person, now we meet in person for at least …
It’s been a while since we’ve posted anything here about Lincoln Loop, so it’s time for a quick update.
In short, we’ve been hard at work. In addition to having multiple speakers at DjangoCon, and starting work on an internal …
We love the Django community and to show our thanks, we’re throwing a private party Wednesday night for DjangoCon attendees. After dinner (9-11pm), come on down to Ground Kontrol, Portland’s favorite classic arcade. We’ll have an open bar (while supplies …
Coverage.py makes it easy to see how much of your code is covered by your test suite. It can be configured to spit out reports in XML (for consumption by a continuous integration server like Jenkins), in HTML (for human …
We’re looking for a Django developer to join our team. With the impending departure of Armin Ronacher to finish his degree, we’re going to be at least one developer short this Fall. We’re looking for somebody who can jump right …
We love pip and Fabric for Django deployment. You can see our boilerplate fabfile.py here. Pip, however, isn’t safe to run in an automated fashion. If you attempt to switch branches or repos for one of your editable requirements, you’ll …
I really like supervisord for long-running process management. It is Python, so it is easy to install and it is easy to script with tools like Fabric. Lately I’ve been deploying smaller Django/WSGI sites with Green Unicorn behind Nginx proxied …
I just finished reading the copy of Django 1.1 Testing and Debugging by Karen M. Tracey provided to us for review by Packt Publishing. For those of you who don’t know, Karen is a core developer of Django and her …
I’m pleased to announce that Gondola for Real Estate, our GeoDjango-backed real estate CMS is publicly accepting new customers. A couple weeks ago, we quietly re-launched gondolacms.com with some details about the platform and what it has to offer, as …
Today, we are launching a new offering at Lincoln Loop, development services paid by the sprint. Previously, our typical engagements involved a (sometimes lengthy) discovery, estimation, and bidding process. Lately, however, people have been asking us to jump in with …
Homebrew seems to be the hot new package manager for OS X, so while setting up a new system last night, I figured I’d see how it handled installing all the external libraries required for GeoDjango. The answer I quickly …
Here’s one I struggled with a bit while upgrading lincolnloop.com yesterday.
Scenario: You need to take your site offline and want to redirect all its traffic to a “down for maintenance” page. For search engine friendliness, that page should return …
As Lincoln Loop has evolved and grown over the last year, we’ve learned a lot not only about software development, but also about all the things that accompany it like budgeting, estimating, and scheduling. Probably the most important one is …
Packt Publishing was nice enough to send us a copy of Django 1.0 Template Development by Scott Newman for review recently. I get most of my technical information via the web, so picking up a technical book was a nice …
In part 1, we showed how we use Fabric to update and deploy Django sites to our development server with a single command. This works great when you only have one developer pushing changes to the server, but what happens …
We’re firm believers in the practices described by the Continuous Integration method of software engineering. Among those are:
Maintain a code repository
Automate the build
Automate deployment
We use git for our code repositories and Fabric to automate our build/deployment …
Last month, Lincoln Loop gave a talk at EuroDjangoCon about customizing the Django admin interface. After presenting some of the admin customizations we had done on Gondola, I had a bunch of people get in touch with me asking me …
I’ve always disliked the way named anchors (<a href="#name">...</a>) behave in browsers. It jumps your viewport to a different part of the page, but it’s rarely obvious which section you have landed on. If the page is long enough, the …
This post got a bit long-winded, skip to the project announcment if you prefer.
One of the things I love about Python and Django is the philosophy that there is one obvious way to do things. Standards make it easy …
While browsing the source code of President Obama’s latest web initiative, recovery.org, I noticed something of interest.
<script type="text/javascript"><!--//--><![CDATA[//><!--jQuery.extend(Drupal.settings, { "basePath": "/" });//--><!]]></script>
Wow, this can’t be true. Can it?
$ curl -I http://www.recovery.gov
HTTP/1.1 200 OK
Cache-Control: must-revalidate
Date: …
Satchmo is an amazing E-Commerce engine built on top of Django. After struggling in the past with difficult packages like ZenCart and OSCommerce, Satchmo’s ease of customization make it a joy to work with.
Unfortunately, all the features can make …
In the process of prepping Gondola CMS for public consumption, we’ve grown from having a developer (me), to having a development team. One pain point that quickly arose was the amount of time it took for new developers to setup …
We all know not to serve static media (images, CSS, Javascript, etc.) in production directly from Django. Thankfully, Django gives us some nice settings like MEDIA_URL and MEDIA_ROOT to make serving them a lot less painless. Lately, however, I’ve come …
After reading the comments on my last post on the subject, I realized there was definitely some room for improvement in my strategy. This is take two of the original post.
Problems
My original strategy had a couple of downfalls: …
Gondola is our content management system built on top of Django. I briefly showed it off during my DjangoCon Lightning Talk, but have been wanting to give it a proper screencast for a while. Here’s an introduction:
A few common …
DjangoCon was an amazing conference all around. I met some great people and learned a lot. I also had the opportunity to get up on stage and present some of the things I’ve been working on here. I was really …
This article is outdated, you’ll find an updated article here.
A friend is in the process of setting up a new slice at everbody’s favorite VPS provider Slicehost and asked for some advice. I use MySQL, Nginx & Apache/mod_wsgi on …
All the recent hub bub about 1 week and 1 day application development, motivated me to see how quickly I could launch a website for myself. I, like many developers, struggle with building and releasing personal sites. Ask a web …
Lincoln Loop has been in “head down” mode for the last couple months. In addition to being knee deep in client projects, we have grown from a one-man development studio to a full-fledged Django development shop/consultancy. We are proud to …
Lately, we’ve been taking over projects from people who began building their first site in Django, but either got in over their head or just found they didn’t have the time to continue. As I review the existing code, the …
For those of you that have been hiding under a rock for the last 12 hours, App Engine is Google’s answer to Amazon Web Services. While it is less flexible in some senses (you don’t have a complete OS at …
One of the things that drew me towards Django was the idea of being able to create reusable applications that would sit on my PYTHONPATH instead of copied across multiple sites. Coming from WordPress, the constant security updates that required …
Download django-cpserver Now at GitHub
Background
A few months ago, I got sick of trying to deploy Django sites on my cPanel server and got a VPS at Slicehost. Thanks to SuperJared, setting up Apache/mod_python behind an Nginx frontend was …
Here’s a little nugget I just posted to Django Snippets. It emulates the behavior of an old Perl script I used way back when, FormMail.pl.
I often find myself needing to build a form whose contents get emailed to the …
The newforms library is a huge time-saver, but when I first started using it, I still found myself writing tedious repetitve code to get it to function how I wanted. While I could get away with it on smaller sites, …
We recently built and launched CashOffersFast.com. It gives people an easy, no-risk way to put their home up for sale. Pre-qualified investors can then make anonymous bids on any home listed with the site.
We worked very closely with the …
I’ve been wanting to update my website for quite a while. It got to the point that I wasn’t referring people to my old site because it had become such a poor representation of what Lincoln Loop has evolved into. …
I’ve been kicking around the idea of switching hosting providers for a while. I finally took the plunge and if you’re reading this, it is being served off the new platform. I’m going to be eating my own dog food …
Hey Adobe,
Progress bars are meant to indicate progress. When they sit in one place for 20+ minutes, it makes people think progress has stopped and something is broken. I shouldn’t have to check my running processes to see if …
A few weeks ago, I released Prudential Steamboat Realty’s new site into the wild. It is my first (but not last) large site built in Django to go live. As usual, ashwebmedia did a great job on redesigning the site …
I’m proud to announce that, as of today, Lincoln Loop, LLC has become a completely carbon neutral business.
Our footprint was pretty minimal to start. Our shared server, Olivia, only draws about 180 watts or 1 ton of CO2 a …
WordPress, you seemed perfect at first. You saved me lots of development time, seemed to have a plugin for everything I needed, and a user interface that was easy for anybody to use.
The honeymoon has worn off though. It …
Just put the final touches on www.bearlodgesteamboat.com. It is a WordPress site designed by ashwebmedia, then hand-coded into a custom WordPress theme at Lincoln Loop.
The new Waterside Day Spa site is out the door. The site was built using WordPress as the backend CMS with a custom theme developed by myself and designed by the talented Derek Ashauer of ashwebmedia.
Overall, I’m very pleased …
As promised, here is the follow-up to the SVN for Web Developers post, Basecamp integration.
Why?
Transparency is very important to my business. The #1 complaint I hear about web developers is that they rarely meet deadlines and the client …
I switched from Ubuntu Linux to a Mac last week. I knew the new system would force me to adapt my workflow a bit so I figured it would be a good opportunity to break some bad habits.
One of …
I just wrapped up development on a website for The Victoria, a high-end mixed use development in downtown Steamboat.
Derek at ashwebmedia is the designer behind the site. It is the first work we’ve done together and he really nailed …
A copy of this letter went out to the NDS Internet client list today.
I am pleased to announce that as of April 1, 2007, NDS Internet will become Lincoln Loop, LLC, Steamboat Springs’ only company dedicated exclusively to website …